Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

Array.method('reduce', function (f, value) {
    var i;
    for (i = 0; i < this.length; i += 1) {
        // 每一次调用 value 都会根据 this[i] 更新
        value = f(this[i], value);  
        console.log(this[i], value);
    }
    return value;
});

// 创建一个数字数组
var data = [4, 8, 15, 16, 23, 42];

// 定义两个简单的函数，一个是把两个数字相加，另一个是把两个数字相乘
var add = function (a, b) {
    return a + b;
};

var mult = function (a, b) {
    return a * b;
};

// 调用 data 的 reduce 方法，传入 add 函数。
var sum = data.reduce(add, 0); // 108

// 再次调用 reduce 方法，这次传入 mult 函数。

var product = data.reduce(mult, 1); // 7418880

// 数组就是对象，可以直接给一个单独的数组添加方法
// 给 data 数组添加一个 total 方法

data.total = function () {
    return this.reduce(add, 0);
};

total = data.total();   // 108